Подключение агента
С помощью этого сценария агентский клиент сам создаёт запрос доступа, ждёт решения владельца проекта и один раз получает первый Agent Token.
Человек всё равно участвует в подключении: агент не может сам назначить себе проект, роль или права. Владелец проверяет запрос и одобряет только необходимый набор permissions.
После получения токена агент переходит к обычным методам Gigma из раздела Агентский доступ.
Результат
В конце сценария у вас будут:
- отдельная учётная запись агента в проекте;
- Agent Token со сроком действия;
- подтверждённый список прав;
- проверенное подключение через
GET /api/user; - готовый список разрешённых инструментов.
Кто участвует
| Участник | Что делает |
|---|---|
| Агентский клиент | создаёт запрос, хранит request_token, проверяет статус, вызывает consume |
| Подтверждающий человек | получает письмо, проверяет запрос, одобряет или отклоняет permissions |
| Gigma | связывает запрос с проектом подтверждающего, создаёт учётную запись агента и выдаёт токен |
Подтверждающим может быть незаблокированный человек с проектом:
- владелец или администратор;
- пользователь с
edit-admins; - пользователь с
edit-permissions.
Учётная запись агента подтверждать запрос не может.
Перед началом
Подготовьте:
- e-mail человека, который может подтвердить доступ; он должен совпадать с его
loginв Gigma; - понятное имя агента;
- уникальный технический
loginагента; - минимальный список
permissions; - короткое описание назначения;
- хранилище секретов для
request_tokenи Agent Token.
Для первого подключения рекомендуется:
{
"permissions": [
"view-orders",
"view-counterparties"
],
"purpose": "Читать заказы и готовить сводки"
} owner_email должен совпадать с login подтверждающего пользователя Gigma. API намеренно не сообщает, найден ли такой пользователь: при неизвестном или неподходящем e-mail запрос всё равно может получить 201, но останется pending до истечения срока.
Учётная запись агента не поддерживает обычный вход сотрудника через:
POST /api/send_password
POST /api/login Для is_agent = true эти методы возвращают 403.
Состояния запроса
Запрос действует 30 минут.
| Статус | Действие клиента |
|---|---|
pending | продолжать редкий опрос статуса |
approved | один раз вызвать consume |
declined | остановить процесс и показать отказ |
expired | создать новый запрос |
consumed | использовать сохранённый Agent Token; повторный consume секрет не вернёт |
create
└─ pending
├─ approved ─ consume ─ consumed
├─ declined
└─ expired Шаг 1. Агент создаёт запрос
Создать запрос агентского доступа
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests- Авторизация
- Не требуется
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
201
Передайте данные агента и права, которые нужны для его первого профиля. project_id и role_id не передаются: проект определяется по подтверждающему человеку, роль выбирает backend во время одобрения.
Параметры запроса
owner_email(string, обязательный) — e-mail подтверждающего пользователя, до 255 символов;agent_name(string, обязательный) — отображаемое имя агента, от 1 до 255 символов;agent_login(string, необязательный) — уникальный технический login, от 3 до 255 символов. Если не передать, backend сформирует его из имени и UUID запроса;permissions(string[], необязательный) — до 100 уникальных permissions сguard_name = user;purpose(string, необязательный) — назначение агента, до 5000 символов.
Пример запроса
{
"owner_email": "owner@example.com",
"agent_name": "Order Assistant",
"agent_login": "agent-order-assistant",
"permissions": [
"view-orders",
"view-counterparties"
],
"purpose": "Читать заказы и готовить сводки"
} Ответ
{
"message": "Если такой администратор есть, мы отправили запрос.",
"request": {
"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
"request_token": "<request_token>",
"expires_at": "2026-08-22T04:30:00+00:00"
}
} Сразу сохраните:
request.public_id— публичный идентификатор процесса;request.request_token— секрет агентского клиента;request.expires_at— крайний срок одобрения и получения токена.
request_token не отправляется владельцу и не должен попадать в URL, логи или контекст модели.
Ответ 201 не гарантирует доставку письма. Gigma не раскрывает существование owner_email, а повторное письмо одному подтверждающему ограничено интервалом 10 минут. Не создавайте новый запрос сразу после успешного ответа.
Ошибки
422— не прошла валидация поля или указано несуществующее permission;429— превышен лимит создания запросов.
Шаг 2. Владелец проверяет запрос
В письме находится ссылка вида:
https://api.gigma.ru/api/agent-access-requests/{publicId}/review#approval_token=<secret> approval_token размещён во fragment, поэтому браузер не отправляет его серверу как часть HTTP-запроса. Страница подтверждения читает секрет, удаляет его из адресной строки и передаёт в JSON body.
Открыть страницу подтверждения
- Метод
- GET
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review- Авторизация
- Не требуется
- Headers
Accept: text/html- Успешный ответ
200
Параметры пути
publicId(string, обязательный) — UUID из ответа создания запроса.
Пример запроса
GET /api/agent-access-requests/3f48862d-516d-4c7b-b486-9b7bb205f920/review HTTP/1.1
Host: api.gigma.ru
Accept: text/html Ответ
HTML-страница подтверждения. Секрет берётся из fragment ссылки и не должен передаваться в query string.
Получить данные запроса для проверки
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review- Авторизация
- Approval token из письма
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
approval_token(string, обязательный) — секрет из fragment ссылки.
Пример запроса
{
"approval_token": "<approval_token>"
} Ответ
{
"status": "pending",
"request": {
"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
"agent_name": "Order Assistant",
"agent_login": "agent-order-assistant",
"role": {
"id": 14,
"name": "employee"
},
"requested_permissions": [
"view-orders",
"view-counterparties"
],
"approved_permissions": null,
"purpose": "Читать заказы и готовить сводки",
"expires_at": "2026-08-22T04:30:00+00:00"
}
} Если approval_token передан в query string, backend возвращает 422. Неверный секрет маскируется как 404.
Шаг 3. Владелец одобряет или отклоняет
Владелец должен сравнить назначение агента с запрошенными permissions. Для первого запуска лучше сократить права, чем одобрить избыточный набор.
Одобрить агентский доступ
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/approve- Авторизация
- Approval token из письма
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
approval_token(string, обязательный) — секрет подтверждения;permissions(string[], необязательный) — итоговое подмножество первоначально запрошенных permissions.
Если permissions не переданы, backend пытается одобрить весь запрошенный набор. Права, которых нет у подтверждающего пользователя, не удаляются автоматически: запрос вернёт 422.
Backend назначает роль employee, а для legacy-проекта — employer. Если подходящей роли нет или пользователь не вправе её назначить, ответ будет 422.
Пример запроса
{
"approval_token": "<approval_token>",
"permissions": [
"view-orders",
"view-counterparties"
]
} Ответ
{
"status": "approved",
"message": "Доступ одобрен. Агент может забрать токен."
} Ошибки
404— запрос или approval token не найден;409— запрос уже обработан либо истёк;422— permissions шире исходного запроса или недоступны подтверждающему.
Отклонить агентский доступ
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/decline- Авторизация
- Approval token из письма
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
approval_token(string, обязательный) — секрет подтверждения.
Пример запроса
{
"approval_token": "<approval_token>"
} Ответ
{
"status": "declined",
"message": "Запрос доступа отклонён."
}Шаг 4. Агент проверяет статус
Проверить статус запроса
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/status- Авторизация
- Request token агентского клиента
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
request_token(string, обязательный) — секрет из ответа создания запроса.
Пример запроса
{
"request_token": "<request_token>"
} Ответ
{
"status": "approved",
"expires_at": "2026-08-22T04:30:00+00:00",
"server_time": "2026-08-22T04:05:12+00:00"
} Используйте интервал опроса не меньше 3–5 секунд. После 429 увеличьте интервал и учтите Retry-After, если заголовок присутствует.
Остановите опрос после declined, expired или consumed. После approved сразу переходите к consume.
request_token передаётся только в JSON body. Query string отклоняется с 422, неверный секрет возвращает 404.
Шаг 5. Агент получает первый токен
Создать учётную запись агента и получить первый токен
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/consume- Авторизация
- Request token агентского клиента
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Вызывайте endpoint только после статуса approved.
Параметры запроса
request_token(string, обязательный) — секрет из ответа создания запроса.
Пример запроса
{
"request_token": "<request_token>"
} Ответ
Первый успешный ответ:
{
"status": "consumed",
"agent": {
"id": 214,
"name": "Order Assistant",
"login": "agent-order-assistant"
},
"agent_token": {
"id": 901,
"name": "mcp-self-service",
"value": "<agent_bearer>",
"expires_at": "2027-08-22T04:05:20+00:00"
}
} agent_token.value показывается только в этом ответе. Сохраните его в хранилище секретов до завершения операции.
Повторный вызов возвращает только состояние:
{
"status": "consumed",
"already_consumed": true
} Backend окончательно проверяет уникальность agent_login во время consume. Если login занят, ответ будет 409; изменить login в одобренном запросе нельзя — создайте новый запрос.
Перед созданием агента backend повторно проверяет подтверждающего пользователя и его проект. Временный 403 или конфликт проекта можно устранить и повторить consume, пока не истёк общий 30-минутный срок.
Шаг 6. Проверьте Agent Token
GET /api/user HTTP/1.1
Host: api.gigma.ru
Authorization: Bearer <agent_token>
Accept: application/json Сверьте:
- login агента;
- состояние
is_banned; - роль и филиал;
- фактический список
permissions.
После проверки включите только нужные методы из раздела Настройте рабочие методы.
Логика агентского клиента
Рекомендуемый алгоритм:
создать запрос
→ сохранить public_id, request_token, expires_at
→ показывать пользователю состояние pending
→ опрашивать status каждые 3–5 секунд
→ approved: один раз вызвать consume
→ атомарно сохранить Agent Token
→ GET /api/user
→ удалить request_token из оперативного состояния Не запускайте несколько consume параллельно и не создавайте новый запрос доступа после каждого сетевого timeout.
Восстановление после ошибок
| Ситуация | Действие |
|---|---|
| Письмо не пришло | проверить e-mail подтверждающего и папку «Спам»; не отправлять повторный запрос раньше 10 минут |
pending длится до expires_at | создать новый запрос и проверить, что подтверждающий пользователь подходит |
declined | показать отказ; новый запрос создавать только после изменения требуемых прав или назначения |
409 Agent login is already taken | выбрать другой login и создать новый запрос |
consume завершился timeout | сначала проверить status; при consumed токен восстановить нельзя |
| Agent Token потерян | человек выпускает новый токен через административный API |
401 на GET /api/user | прекратить вызов инструментов и запросить новый токен |
403 на рабочем методе | не обходить запрет другим endpoint; сверить permissions и policy |
Секреты
Храните request_token и agent_token.value только в хранилище секретов. Никогда не помещайте их в URL, query string, аналитику, сообщения об ошибках и access-логи.
approval_token приходит только во fragment ссылки, сформированной Gigma. Не переносите его из fragment в query string и не копируйте в логи или контекст модели.
В базе Gigma request_token и approval_token хранятся в виде hash. Значение Agent Token повторно не показывается.
Текущие ограничения запросов
| Endpoint | Ограничение |
|---|---|
POST /api/agent-access-requests | 5/min |
GET /api/agent-access-requests/{publicId}/review | 30/min |
POST /api/agent-access-requests/{publicId}/review | 30/min |
POST /api/agent-access-requests/{publicId}/approve | 10/min |
POST /api/agent-access-requests/{publicId}/decline | 10/min |
POST /api/agent-access-requests/{publicId}/status | 30/min |
POST /api/agent-access-requests/{publicId}/consume | 10/min |
Это текущая runtime-конфигурация routes, а не бессрочное продуктовое обещание. Клиент должен корректно обрабатывать 429.
Готово
Агент создал запрос, владелец одобрил permissions, первый токен сохранён, а подключение проверено через GET /api/user.
Для ротации, отключения или ручного создания учётной записи откройте Управление агентами и токенами.